7.3 类型转换
类型推断可将接口变量还原为原始类型,或用来判断是否实现了某个更具体的接口类型。
type data int
func(d data)String()string{
return fmt.Sprintf("data:%d",d)
}
func main() {
var d data=15
var x interface{} =d
if n,ok:=x.(fmt.Stringer);ok{ // 转换为更具体的接口类型
fmt.Println(n)
}
if d2,ok:=x.(data);ok{ // 转换回原始类型
fmt.Println(d2)
}
e:=x.(error) // 错误:main.data is not error
fmt.Println(e)
}输出:
data:15
data:15
panic:interface conversion:main.data is not error:missing method Error
使用ok-idiom模式,即便转换失败也不会引发panic。还可用switch语句在多种类型间做出推断匹配,这样空接口就有更多发挥空间。
func main() {
var x interface{} =func(x int)string{
return fmt.Sprintf("d:%d",x)
}
switch v:=x.(type) { // 局部变量v是类型转换后的结果
case nil:
println("nil")
case*int:
println(*v)
case func(int)string:
println(v(100))
case fmt.Stringer:
fmt.Println(v)
default:
println("unknown")
}
}
输出:
d:100
提示:type switch不支持fallthrought。